//设置为东八区
process.env.TZ = 'Asia/Shanghai'

const path = require('path'),
      fs = require('fs'),
      Koa = require('koa'),
      cors= require('koa2-cors'),
      globalModules = require('./modules/global')()

//初始化KOA2
const app = new Koa()



//配置跨域
app.use(cors({
    // @ts-ignore
    origin: function(ctx){
        const whiteList = config.whiteList
        let url = ctx.header.origin
        if(whiteList.includes(url)){
            ctx.set('Access-Control-Allow-Origin', url); //允许来自所有域名请求(不携带cookie请求可以用*，如果有携带cookie请求必须指定域名)
            ctx.set('Access-Control-Allow-Headers', '*'); //字段是必需的。它也是一个逗号分隔的字符串，表明服务器支持的所有头信息字段.
            ctx.set('Access-Control-Allow-Methods', '*');
            ctx.set('Access-Control-Allow-Credentials', true); // 该字段可选。它的值是一个布尔值，表示是否允许发送Cookie。默认情况下，Cookie不包括在CORS请求之中。
            return "*" // 注意，这里域名末尾不能带/，否则不成功，所以在之前我把/通过substr干掉了
        }
    },
    maxAge: 5,
}))

//获取post && 上传数据数据
const {koaBody} = require('koa-body')
app.use(koaBody({
    multipart: true,
    formidable: {
        uploadDir: config.upload.uploadDir,
        keepExtensions: config.upload.keepExtensions, // 保持后缀名
        maxFileSize: config.upload.maxFileSize, //上传文件的大小
        onFileBegin: (name, file) => {
            //防止文件注入的一些方法
            if (global.config.upload.allowFileType.indexOf(file.mimetype) === -1) {
                file.uploadStatus = "error"
                file.uploadErrorMessage = '文件类型不正确'
            }
        },
        onError(err) {
            console.error('上传错误', err)
        }
    }
}))

//路由Token守卫
const guard = require('./routers/guard')
app.use(guard)

//遍历配置路由
const router = require('./routers')
app.use(router.routes())



//启动KOA
app.on('error', (err) => {
    console.error(err)
})
app.listen(config.port, () => {
    let content = "WOS服务已启动,端口是:" + config.port
    console.log(global.colors(['green'],'[√]' + content))
})


//错误路由处理
app.use(async (ctx, next)=>{
    try{
        await next();
        if(!ctx.body){
            global.response(ctx, {
                "status":404,
                "code": 404,
                // "data": fs.readFileSync(path.join(__dirname,'./static/error/404.html'),{encoding:'utf8', flag:'r'}),
                "data": '',
                "msg":'请求不存在'
            })
        }
    }catch(err){
        global.response(ctx, {
            "status": 500,
            "code": 500,
            // "data": fs.readFileSync(path.join(__dirname,'./static/error/500.html'),{encoding:'utf8', flag:'r'}),
            "data": '',
            "msg":'请联系管理员'
        })
        console.error('请检查/src/static/error/404.html文件是否存在', err)
    }
})
